前言

每到节假日出行高峰,火车票都比较紧张,这时候如果有个小工具能自动查询余票信息,并且微信通知,相信大家都会觉得很方便.12306官网的自动提醒功能,每5s才能刷新一次,很不友好.既然如此,我们应该让他对我们友好.

程序设计

请求、解析、处理数据是通用爬虫的三个步骤。在这个案例中,我们请求12306的查询接口,解析自己想要车票数据,再通过第三方服务微信通知我们。

分析网页

  1. 点击查询获取数据的响应 20200412141249-2021-12-29-14-56-42

  2. 通过分析链接发现是get请求,并且需要携带三个参数,并且发车站和到车站用JS处理过,后台传过去的是代号 20200412141714-2021-12-29-14-57-10

  3. 通过搜索功能搜索到城市代码表 20200412142332-2021-12-29-14-57-39

  4. 分析https://kyfw.12306.cn/otn/resources/js/framework/station_name.js?station_version=1.9142,发现 中文 | CODE是我们需要的格式 20200412143243-2021-12-29-14-58-05

  5. 我需要的数据是车次,出发时间,到达时间,二等座票数。分析返回的响应数据,我想要的数据分别对应3,8,9,30
    20200412145518-2021-12-29-14-58-43

Server酱推送功能

Server酱推送在她官网有详细介绍,我这里就不罗嗦了。

代码实现

根据我们以上的分析,下面就开始写代码了. 步骤:

  1. 获取城市站点名称和代码对应规则

  2. 根据获取的规则拼接我们要请求的url

  3. 发送请求,解析,并通过server酱推送到我们微信

    -- coding: utf-8 --

    import requests import re import time

    requests.packages.urllib3.disable_warnings()

    headers = { 'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.113 Safari/537.36' }

    封装的server酱推送函数

    def send_msg(title,info): url=('https://sc.ftqq.com/SCU92306T720aa3d22514912ba47be0fd854826ef5e85b1970ff90.send?' 'text={}&desp={}').format(title,info) requests.get(url) #获取城市站点名称和代码对应规则 def get_city_station_code(): url="https://kyfw.12306.cn/otn/resources/js/framework/station_name.js?station_version=1.9142" r = requests.get(url,verify=False,headers=headers) pattern = u'([\u4e00-\u9fa5]+)|([A-Z]+)' result = re.findall(pattern,r.text) city_station_rule=dict(result) return city_station_rule

    拼接我们的请求URL

    def get_query_url(from_station_name,to_station_name,date,ticket_type="ADULT"): station_rule=get_city_station_code() from_station_code=station_rule[from_station_name] to_station_code=station_rule[to_station_name] url=('https://kyfw.12306.cn/otn/leftTicket/query?' 'leftTicketDTO.train_date={}&' 'leftTicketDTO.from_station={}&' 'leftTicketDTO.to_station={}&' 'purpose_codes={}' ).format(date,from_station_code,to_station_code,ticket_type) return url #发送请求,解析,并通过server酱推送到我们微信 def query_analysis_send(url): s=requests.session() r= s.get('https://kyfw.12306.cn/otn/leftTicket/init',headers=headers) r= s.get(url,verify=False,headers=headers) raw_trains=r.json()['data']['result'] train_info='' info_list=[] for raw_train in raw_trains: data_list = raw_train.split('|') train_no=data_list[3] start_time = data_list[8] arrive_time = data_list[9] second_seat=data_list[30] or '--' info = ('车次:{} ,' '出发时间:{} ,' '到达时间:{} ,' '二等座票数:{}\n' ).format(train_no,start_time,arrive_time,second_seat) if(second_seat.isdigit()): info_list.append(info) if(info_list.len()>0): for value in info_list: train_info+=value+'\n' send_msg(title='有票啦',info = train_info) return True #执行程序入口 if name == "main": url = get_query_url("南昌","上海","2020-04-17") while True: time.sleep(1) if query_analysis_send(url): break

THE END
推荐文章
  • python如何安装包管理器pip

  • 把自己镜像推送到dockerhub

  • html-webpack-plugin插件不解析img的src

  • 如何测试crontab是否有效

  • 黄帝内经-脉要精微论-望闻问切四诊法(1)

  • 打印机选购攻略

  • 如何彻底关闭win10自动更新

  • Webpack file-loader outputs [object Module]

评论 共0条
开启精彩搜索

热门搜索

暂无

历史搜索

用户名/邮箱/手机号
密码
用户名
密码
重复密码
邮箱/手机号
验证码
发送验证码
59秒后可重发
注册
找回密码
邮箱/手机号
验证码
发送验证码
59秒后可重发
新密码
重复密码
请选择支付方式
余额支付

购买将消耗【10

微信支付
微信扫码支付 0 元
[ 04分50秒 ]
请使用微信扫一扫
扫描二维码支付
支付宝支付
支付宝扫码支付 0 元
[ 04分50秒 ]
请使用支付宝扫一扫
扫描二维码支付
已完成支付
未完成支付

请输入验证码

点击验证码可以刷新

你确认吗?

确认

2024年10月1日

0字

0字

2024年10月

0字

新增

0字

新增

0字

0字

新增

0字

0字

新增

0字

0字

新增

0字

0字

新增

0字

0字

新增

0字

0字

新增

0字

0字

0字

新增

0字

0字

0字

0字

新增

0字

0字